local CJ = require "jass.common"
--local globals = require "jass.globals"
local japi = require "jass.japi"

---'xmapi'
---@class xmapi
local xmapi = {}

local _group = CJ.CreateGroup()

---移动类型
---@class xmapi.MOVE_TYPE
xmapi.MOVE_TYPE = {
    NONE = 0,           --没有
    FOOT = 0x2000002,   --步行
    FLY = 0x4000004,    --飞行
    FLOAT = 0x40000040, --漂浮(水)
    AMPH = 0x80000080,  --两栖
}

---@class xmapi.FRAME_STYLE
xmapi.FRAME_STYLE = {
    SETSVIEWPORT = 0x01,
    IGNORETRACKEVENTS = 0x02,
    SCROLL = 0x08,
    NODEPTHSET = 0x10,
    NODEPTHTEST = 0x20,

    _3DWINDOW = 1,
    _SHADING = 4
}

---@class xmapi.TEXT_STYLE
xmapi.TEXT_STYLE = {
    NOWRAP               = 0x1,
    --=0x4
    FIXEDSIZE            = 0x8,
    FIXEDCOLOR           = 0x10,
    NONPROPORTIONAL      = 0x20,
    PASSWORDFIELD        = 0x100,
    HIGHLIGHTONMOUSEOVER = 0x200,
    -- =0x400
    FIXEDWIDTH           = 0x800,
    IGNORECOLORCODES     = 0x1000,
    IGNORENEWLINES       = 0x2000,
}

---@enum xmapi.UINT_EVENT_TYPE
xmapi.UINT_EVENT_TYPE = {
    CREATE = 0,
    DESTROY = 1,
}

---@enum xmapi.ITEM_EVENT_TYPE
xmapi.ITEM_EVENT_TYPE = {
    DESTROY = 1,
}

---@enum xmapi.OBJECT_DATA
xmapi.OBJECT_DATA = {
    DATA_ART = 1,
    DATA_TIP = 2,
    DATA_UBERTIP = 3,
    DATA_NAME = 4,
    DATA_DESCRIPTION = 5,
    DATA_PROPERNAME = 6,

    DATA_MISSILESPEED = 101,
    DATA_COLLISION = 102,
    DATA_REGEN_HP = 103,
    DATA_REGEN_MANA = 104,
    DATA_LIFE_TIME = 105,
    DATA_HP_HEIGHT = 106,
    DATA_MISSILESPEED2 = 107,
    DATA_MISSILEART1 = 108,
    DATA_MISSILEART2 = 109,


    DATA_EXTEND1 = 200,
    DATA_EXTEND2 = 201,
    DATA_EXTEND3 = 202,
    DATA_EXTEND4 = 203,
    DATA_EXTEND5 = 204,
    DATA_EXTEND6 = 205,
    DATA_EXTEND7 = 206,
    DATA_EXTEND8 = 207,
    DATA_EXTEND9 = 208,
    DATA_EXTEND10 = 209,
    DATA_EXTEND11 = 210,
    DATA_EXTEND12 = 211,
    DATA_EXTEND13 = 212,
    DATA_EXTEND14 = 213,
    DATA_EXTEND15 = 214,
    DATA_EXTEND16 = 215,
    DATA_EXTEND17 = 216,
    DATA_EXTEND18 = 217,
    DATA_EXTEND19 = 218,
    DATA_EXTEND20 = 219,

    DATA_MODEL = 254,
}

---@class xmapi.ATTRIBUTE
xmapi.ATTRIBUTE = {
    STR = 1, --力量
    INT = 2, --智力
    AGI = 3, --敏捷
}

---@class xmapi.FrameSetAlphaType
xmapi.FrameSetAlphaType = {
    NONE = 0,
    OUTLINE = 1,
    SHADE = 2,
    FILETEXTURE = 3,
}

---@class xmapi.FrameSetAlphaMode
xmapi.FrameSetAlphaMode = {
    DISABLE = 0,
    ALPHAKEY = 1,
    BLEND = 2,
    ADD = 3,
    MODULATE = 4,
    MODULATE2X = 5,
}

---@class xmapi.DetailGroupType
xmapi.DetailGroupType = {
    NONE = -1,
    UNIT = 0,
    UPGRADE = 1
}

---@enum xmapi.AnchorType
xmapi.AnchorType = {
    LEFT_TOP = 0,    --左上
    TOP = 1,         --上
    RIGHT_TOP = 2,   --右上
    LEFT = 3,        --左中
    CENTET = 4,      --中心
    RIGHT = 5,       --右中
    LEFT_BOTTOM = 6, --左下
    BOTTOM = 7,      --下中
    RIGHT_BOTTOM = 8 --右下
}

---@enum xmapi.ItemStyle
xmapi.ItemStyle = {
    PERISHABLE = 0x40, --使用完消失
    DROP = 0x80,       --死亡掉落
    USABLE = 0x200,    --主动使用
    DROPPABLE = 0x400, --可以丢弃
    POWERUP = 0x800,   --拾取自动使用
    INFINITE = 0x1000, --无限使用
    PAWNABLE = 0x2000, --可被抵押
}


---特效
---添加异步特效
---@type fun(模型路径:string,x:number,y:number):effect
xmapi.XMAddLocalEffect = japi.XMAddLocalEffect

---绑定特效到特效
---@type fun(特效:effect,追加点:string,绑定特效:effect)
xmapi.XMBindEffect = japi.XMBindEffect

---解绑特效
---@type fun(特效:effect)
xmapi.XMUnbindEffect = japi.XMUnbindEffect

---显示/隐藏特效
---@type fun(特效:effect,模式:boolean)
xmapi.XMShowEffect = japi.XMShowEffect

---获得特效是否显示
---@type fun(特效:effect):boolean
xmapi.XMIsShowEffect = japi.XMIsShowEffect

---设置特效坐标(ydwe的设置坐标有bug) e:特效 x,y:坐标
---@type fun(特效:effect,x:number,y:number)
xmapi.XMSetEffectXY = japi.XMSetEffectXY

---设置特效模型 e:特效 path:模型路径
---@type fun(特效:effect,模型路径:string)
xmapi.XMSetEffectModel = japi.XMSetEffectModel

---设置特效动画(序号模式) e:特效 index:序号 autocast:自动匹配
---@type fun(特效:effect,序号:integer,自动切换:boolean)
xmapi.XMSetEffectAnimateByIndex = japi.XMSetEffectAnimateByIndex

---设置特效动画 e:特效 aniname:动画名字
---@type fun(特效:effect,动作名:string)
xmapi.XMSetEffectAnimate = japi.XMSetEffectAnimate

---设置特效颜色 e:特效 r:红色(0-255) g:() b a:透明度
---红色值:0-255
---绿色值:0-255
---蓝色值:0-255
---透明值:0-255
---@type fun(特效:effect,红色值:integer,绿色值:integer,蓝色值:integer,透明值:integer)
xmapi.XMSetEffectVertexColor = japi.XMSetEffectVertexColor

---查找矩形内特效 r:矩形 filter:过滤函数 code执行函数
---@type fun(矩形:rect,过滤函数:filterfunc,处理函数:fun())
xmapi.XMEnumEffectInRect=japi.XMEnumEffectInRect

---查找圆形内特效 x,y:坐标 radius:半径 filter:过滤函数 code执行函数
---@type fun(x:number,y:number,半径:number,过滤函数:filterfunc,处理函数:fun())
xmapi.XMEnumEffectInRange=japi.XMEnumEffectInRange

---获得枚举特效 (XMEnumEffectInRect,XMEnumEffectInRect中使用)
---@type fun():特效:effect
xmapi.XMGetEnumEffect=japi.XMGetEnumEffect

---获得过滤特效 (XMEnumEffectInRect,XMEnumEffectInRect中使用)
---@type fun():特效:effect
xmapi.XMGetFilterEffect=japi.XMGetFilterEffect

---替换YDWE移动特效函数
---@type fun(是否替换:boolean)
 xmapi.XMReplaceEXSetEffectXY=japi.XMReplaceEXSetEffectXY

---界面-------------------------------------------------------------

---创建界面
---id 一般为0
---@type fun(类型:string,名字:string,父类:integer,模板:string,id:integer):界面:integer
xmapi.XMCreateFrameByTagName=japi.XMCreateFrameByTagName

---释放界面
---@type fun(界面:integer)
xmapi.XMDestroyFrame=japi.XMDestroyFrame

---设置界面图片
---@type fun(界面:integer,图片路径:string,样式:integer)
xmapi.XMFrameSetTexture=japi.XMFrameSetTexture

---设置编辑框限制字数
---@type fun(界面:integer,限制长度:integer)
 xmapi.XMFrameSetTextSizeLimit=japi.XMFrameSetTextSizeLimit

---获得编辑框限制字数
---@type fun(界面:integer):限制长度:integer
xmapi.XMFrameGetTextSizeLimit=japi.XMFrameGetTextSizeLimit

---设置界面大小
---@type fun(界面:integer,宽度:number,高度:number)
 xmapi.XMFrameSetSize=japi.XMFrameSetSize

---获取界面宽度
---@type fun(界面:integer):number
xmapi.XMFrameGetWidth = japi.XMFrameGetWidth

---获取界面高度
---@type fun(界面:integer):number
xmapi.XMFrameGetHeight = japi.XMFrameGetHeight

---获取界面宽度-可获得Smiple宽度
---@type fun(界面:integer):number
xmapi.XMFrameGetWidth2 = japi.XMFrameGetWidth2

---获取界面高度-可获得Smiple宽度
---@type fun(界面:integer):number
xmapi.XMFrameGetHeight2 = japi.XMFrameGetHeight2

---清除界面锚点
---@type fun(界面:integer)
xmapi.XMFrameClearAllPoints=japi.XMFrameClearAllPoints

---设置绝对位置
---@type fun(界面:integer,锚点:FramePoints, x:number, y:number)
xmapi.XMFrameSetAbsolutePoint=japi.XMFrameSetAbsolutePoint

---设置界面锚点
---@type fun(界面:integer,锚点:xmapi.AnchorType,相对界面:integer,相对锚点:xmapi.AnchorType,x:number,y:number)
xmapi.XMFrameSetPoint=japi.XMFrameSetPoint

---获取界面锚点类型\
---类型 0:失败 1:绝对位置 2:相对位置
---@type fun(界面:integer,锚点:xmapi.AnchorType):类型:integer
xmapi.XMFrameGetPointType=japi.XMFrameGetPointType

---获取界面相对界面
---@type fun(界面:integer,锚点:xmapi.AnchorType):相对界面:integer
xmapi.XMFrameGetRelativeFrame=japi.XMFrameGetRelativeFrame

---获取界面相对锚点
---@type fun(界面:integer,锚点:xmapi.AnchorType):相对锚点:xmapi.AnchorType
xmapi.XMFrameGetRelativePoint=japi.XMFrameGetRelativePoint

---获取界面x位置
---@type fun(界面:integer,锚点:xmapi.AnchorType):x位置:number
xmapi.XMFrameGetX=japi.XMFrameGetX

---获取界面y位置
---@type fun(界面:integer,锚点:xmapi.AnchorType):y位置:number
xmapi.XMFrameGetY=japi.XMFrameGetY

---获取界面左下点x位置
---@type fun(界面:integer):x位置:number
xmapi.XMFrameGetX2=japi.XMFrameGetX2

---获取界面左下点y位置
---@type fun(界面:integer):y位置:number
xmapi.XMFrameGetY2=japi.XMFrameGetY2

---设置界面文本
---@type fun(界面:integer,文本:string)
xmapi.XMFrameSetText=japi.XMFrameSetText

---获得界面文本
---@type fun(界面:integer):文本:string
xmapi.XMFrameGetText=japi.XMFrameGetText

---设置界面应用/禁用
---@type fun(界面:integer,是否应用:boolean)
 xmapi.XMFrameSetEnable=japi.XMFrameSetEnable

---获得界面应用/禁用
---@type fun(界面:integer):是否应用:boolean
xmapi.XMFrameGetEnable=japi.XMFrameGetEnable

---设置界面字体
---类型 0,1,2
---描边大小, 像素为单位,默认值2
---@type fun(界面:integer,字体文件:string,高度:number,类型:integer,描边大小:integer)
xmapi.XMFrameSetFont=japi.XMFrameSetFont

---设置界面文字对齐方式
---@type fun(界面:integer,对齐方式:integer)
xmapi.XMFrameSetTextAlignment=japi.XMFrameSetTextAlignment

---设置界面透明度
---透明度 0-255
---@type fun(界面:integer,透明度:integer)
xmapi.XMFrameSetAlpha=japi.XMFrameSetAlpha

---显示隐藏界面
---@type fun(界面:integer,是否显示:boolean)
 xmapi.XMFrameShow=japi.XMFrameShow

---获取界面是否显示
---@type fun(界面:integer):是否显示:boolean
xmapi.XMFrameIsVisible=japi.XMFrameIsVisible

---获取界面的父界面
---@type fun(界面:integer,父界面:integer)
xmapi.XMFrameSetParent=japi.XMFrameSetParent

---获取界面的父界面
---@type fun(界面:integer):界面:integer
xmapi.XMFrameGetParent=japi.XMFrameGetParent

---鼠标所在的Frame控件指针
---@type fun():界面:integer
xmapi.XMGetMouseFocus = japi.XMGetMouseFocus

---获得游戏界面
---@type fun():界面:integer
xmapi.XMGetGameUI = japi.XMGetGameUI


---获得英雄按钮
---@type fun(位置:integer):英雄按钮界面:integer
xmapi.XMFrameGetHeroBarButton = japi.XMFrameGetHeroBarButton

---获得英雄按钮普通状态图片界面
---@type fun(位置:integer):界面:integer
xmapi.XMFrameGetHeroBarButtonImage = japi.XMFrameGetHeroBarButtonImage

---获得英雄按钮禁用状态图片
---@type fun(位置:integer):界面:integer
xmapi.XMFrameGetHeroBarButtonImageDisable = japi.XMFrameGetHeroBarButtonImageDisable

---获得英雄按钮对应的单位
---@type fun(位置:integer):单位:unit
xmapi.XMGetHeroBarButtonUnit = japi.XMGetHeroBarButtonUnit

---获得物品栏按钮
---@type fun(位置:integer):按钮:integer
xmapi.XMFrameGetItemBarButton = japi.XMFrameGetItemBarButton

---获得原生拖动的物品
---@type fun():物品:item
xmapi.XMFrameGetHoldItem = japi.XMFrameGetHoldItem

---清除原生拖动的物品
---@type fun()
xmapi.XMFrameClearHoldItem = japi.XMFrameClearHoldItem

---获得头像界面的模型
---@type fun():模型:string
xmapi.XMGetPortraitModel = japi.XMGetPortraitModel

---获得聊天输入框界面
---@type fun():界面:integer
xmapi.XMGetChatEditBoxUI = japi.XMGetChatEditBoxUI

---聊天输入框是否打开
---@type fun():是否打开:boolean
xmapi.XMIsChatExitBoxOn = japi.XMIsChatExitBoxOn

---获取SimpleTop界面
---@type fun():界面:integer
xmapi.XMGetSimpleTop = japi.XMGetSimpleTop

---创建头像界面
---@type fun(父界面:integer ):界面:integer
xmapi.XMFrameCreatePortrait = japi.XMFrameCreatePortrait

---设置界面属性-字符串
---@type fun(界面:integer,标记:integer,字符串:string)
xmapi.XMFrameSetAttr = japi.XMFrameSetAttr

---获取界面属性-字符串
---@type fun(界面:integer,标记:integer):字符串:string
xmapi.XMFrameGetAttr = japi.XMFrameGetAttr

---设置界面属性-整数
---@type fun(界面:integer,标记:integer,整数:integer)
xmapi.XMFrameSetAttrInteger = japi.XMFrameSetAttrInteger

---获取界面属性-整数
---@return integer 整数
---@type fun(界面:integer,标记:integer):整数:integer
xmapi.XMFrameGetAttrInteger = japi.XMFrameGetAttrInteger

---设置界面属性-实数
---@type fun(界面:integer,标记:integer,实数:number)
xmapi.XMFrameSetAttrReal = japi.XMFrameSetAttrReal

---获取界面属性-实数
---@type fun(界面:integer,标记:integer):实数:number
xmapi.XMFrameGetAttrReal = japi.XMFrameGetAttrReal

---清空界面属性
---@type fun(界面:integer,标记:integer)
xmapi.XMFrameClearAttr = japi.XMFrameClearAttr

---查找界面
---@type fun(界面:integer,名字:string,id:integer):界面:integer
xmapi.XMFrameFindByName = japi.XMFrameFindByName

---查找子界面
---返回0为没找到
---@type fun(界面:integer,名字:string,id:integer):界面:integer
xmapi.XMFrameFindChildByName = japi.XMFrameFindChildByName

---获得界面名
---@type fun(界面:integer):名字:string
xmapi.XMFrameGetName = japi.XMFrameGetName

---获取界面缩放
---@type fun(界面:integer):缩放:number
xmapi.XMFrameGetScale = japi.XMFrameGetScale

---获取TEXT文字宽度
---@type fun(界面:integer):界面宽度:number
xmapi.XMFrameGetTextWidth = japi.XMFrameGetTextWidth

---获取TEXT文字高度
---@type fun(界面:integer):界面高度:number
xmapi.XMFrameGetTextHeight = japi.XMFrameGetTextHeight

---读取TOC文件
---@type fun(TOC文件:string)
xmapi.XMLoadToc = japi.XMLoadToc

---设置界面样式
---@type fun(界面:integer,界面样式:xmapi.FRAME_STYLE)
xmapi.XMFrameSetStyle = japi.XMFrameSetStyle

---获得界面样式
---@type fun(界面:integer):xmapi.FRAME_STYLE 界面样式
xmapi.XMFrameGetStyle = japi.XMFrameGetStyle

---设置TEXT样式
---@type fun(界面:integer,界面样式:xmapi.TEXT_STYLE)
xmapi.XMTextSetStyle = japi.XMTextSetStyle

---获得TEXT样式
---@type fun(界面:integer):xmapi.TEXT_STYLE 界面样式
xmapi.XMTextGetStyle = japi.XMTextGetStyle

---设置ui为裁剪模式(ui显示模型,制作滚动ui) frame:ui isview:是否为裁剪模式
---@param frame integer 界面
---@param isview boolean 是否裁剪
function xmapi.XMFrameSetViewPort(frame, isview)
    local style = xmapi.XMFrameGetStyle(frame)
    if isview then
        style = style | xmapi.FRAME_STYLE.SETSVIEWPORT
    else
        style = style & (~xmapi.FRAME_STYLE.SETSVIEWPORT)
    end
    xmapi.XMFrameSetStyle(frame, style)
end

---设置ui为裁剪模式(ui显示模型,制作滚动ui) frame:ui isview:是否为裁剪模式
---@param frame integer 界面
---@param isview boolean 是否裁剪
function xmapi.XMFrameSetScroll(frame, isview)
    local style = xmapi.XMFrameGetStyle(frame)
    if isview then
        style = style | xmapi.FRAME_STYLE.SCROLL
    else
        style = style & (~xmapi.FRAME_STYLE.SCROLL)
    end
    xmapi.XMFrameSetStyle(frame, style)
end

---设置ui为裁剪模式(ui显示模型,制作滚动ui) frame:ui isview:是否为裁剪模式
---@param frame integer 界面
---@param isview boolean 是否裁剪
function xmapi.XMFrameSetIgnoreTrackEvents(frame, isview)
    local style = xmapi.XMFrameGetStyle(frame)
    if isview then
        style = style | xmapi.FRAME_STYLE.IGNORETRACKEVENTS
    else
        style = style & (~xmapi.FRAME_STYLE.IGNORETRACKEVENTS)
    end
    xmapi.XMFrameSetStyle(frame, style)
end

---设置ui摄像机位置 frame:ui x,y,z:坐标
---@type fun(界面:integer,x:number,y:number,z:number)
xmapi.XMFrameSetCameraSource = japi.XMFrameSetCameraSource

---设置ui摄像机目标位置 frame:ui x,y,z:坐标
---@type fun(界面:integer,x:number,y:number,z:number)
xmapi.XMFrameSetCameraTarget = japi.XMFrameSetCameraTarget

---将界面置顶
---@type fun(界面:integer):是否是Simple界面:boolean
xmapi.XMIsSimpleFrame = japi.XMIsSimpleFrame

---
---@type fun(界面:integer):priority:integer
xmapi.XMFrameGetPriority = japi.XMFrameGetPriority

---将界面置顶
---@param frame integer 界面
---@param level integer 优先级
xmapi.XMFrameSetPriority = function(frame, level)
    if xmapi.XMIsSimpleFrame(frame) then
        japi.XMFrameSetPriority(frame, level)
        return
    end
    local priority_error = xmapi.XMCreateFrameByTagName("FRAME", "_priority_error", frame, "", 0)
    japi.XMFrameSetPriority(frame, level)
    xmapi.XMDestroyFrame(priority_error)
end

---设置界面模型
---@type fun(界面:integer,模型文件:string?,模型类型:integer,样式:integer)
xmapi.XMFrameSetModel = japi.XMFrameSetModel

---绑定特效到Frame模型
---@return effect 特效
---@type fun(界面:integer,模型文件:string,绑定点:string):特效:effect
xmapi.XMFrameAddEffect = japi.XMFrameAddEffect

---复位界面中模型的矩阵 frame:ui
---@type fun(界面:integer)
xmapi.XMFrameSetModelMatReset = japi.XMFrameSetModelMatReset

---设置界面中模型的xy坐标 frame:ui x,y:坐标
---@type fun(界面:integer,x:number,y:number)
xmapi.XMFrameSetModelXY = japi.XMFrameSetModelXY

---设置界面中模型的z坐标 frame:ui z:z坐标
---@type fun(界面:integer,z坐标:number)
xmapi.XMFrameSetModelZ = japi.XMFrameSetModelZ

---设置界面模型颜色
---红色(0-255)
---绿(0-255)
---蓝(0-255)
---透明度(0-255)
---@type fun(界面:integer,红:integer,绿:integer,蓝:integer,透明度:integer)
xmapi.XMFrameSetModelVertexColor = japi.XMFrameSetModelVertexColor

---播放UI模型动画
---@type fun(界面:integer,序号:integer,自动匹配:boolean)
xmapi.XMFrameSetModelAnimateByIndex = japi.XMFrameSetModelAnimateByIndex

---播放UI模型动画
---@type fun(界面:integer,动作名:string)
xmapi.XMFrameSetModelAnimate = japi.XMFrameSetModelAnimate

---设置界面模型队伍颜色
---@type fun(界面:integer,玩家颜色:playercolor)
xmapi.XMFrameSetModelColorByPlayer = japi.XMFrameSetModelColorByPlayer

---设置界面模型缩放
---@type fun(界面:integer,x缩放:number,y缩放:number,z缩放:number)
xmapi.XMFrameSetModelScale = japi.XMFrameSetModelScale

---设置界面模型动画速度
---@type fun(界面:integer,速度:number)
xmapi.XMFrameSetModelSpeed = japi.XMFrameSetModelSpeed

---设置ui中模型的大小(暂时没发现用处) frame:ui size:大小
---@type fun(界面:integer,大小:number):integer
xmapi.XMFrameSetModelSize = japi.XMFrameSetModelSize

---设置界面中模型的x旋转 frame:ui rotatex:x旋转弧度
---@type fun(界面:integer,x旋转:number):integer
xmapi.XMFrameSetModelRotateX = japi.XMFrameSetModelRotateX

---设置ui中模型的y旋转 frame:ui rotatey:y旋转弧度
---@type fun(界面:integer,y旋转:number):integer
xmapi.XMFrameSetModelRotateY = japi.XMFrameSetModelRotateY

---设置ui中模型的z旋转 frame:ui rotatez:z旋转弧度
---@type fun(界面:integer,z旋转:number):integer
xmapi.XMFrameSetModelRotateZ = japi.XMFrameSetModelRotateY

---获得命令按钮类型
---返回 0:未知类型 1:单位类型 2:物品类型 3:技能类型 4:命令类型
---@type fun(列数:integer,行数:string):integer
xmapi.XMGetCommandButtonType = japi.XMGetCommandButtonType

---获得命令按钮ID
---@type fun(列数:integer,行数:string):integer
xmapi.XMGetCommandButtonId = japi.XMGetCommandButtonId

---设置界面的混合文件
---@type fun(界面:integer,图片:string)
xmapi.XMFrameSetAlphaFile = japi.XMFrameSetAlphaFile

---设置界面的混合类型
---@type fun(界面:integer,类型:xmapi.FrameSetAlphaType)
xmapi.XMFrameSetAlphaType = japi.XMFrameSetAlphaType

---设置界面的混合模式
---@type fun(界面:integer,模式:xmapi.FrameSetAlphaMode)
xmapi.XMFrameSetAlphaMode = japi.XMFrameSetAlphaMode

---设置界面的混合颜色
---@type fun(界面:integer,颜色:integer)
xmapi.XMFrameSetAlphaColor = japi.XMFrameSetAlphaColor


---控制台
---获得控制台事件索引
---@type fun():事件索引:integer
xmapi.XMConsoleEventIndex = japi.XMConsoleEventIndex

---获得控制台状态
---@type fun():事件索引:integer
xmapi.XMConsoleEventState = japi.XMConsoleEventState

---获得详情页的单位
---@type fun():单位:unit
xmapi.XMGetDetailUnit = japi.XMGetDetailUnit

---获得详情页的可破坏物
---@type fun():可破坏物:destructable
xmapi.XMGetDetailDestructable = japi.XMGetDetailDestructable

---获得详情页的物品
---@type fun():物品:item
xmapi.XMGetDetailItem = japi.XMGetDetailItem

---获得详情页的组的单位
---@type fun(位置:integer):单位:unit
xmapi.XMGetDetailGroupUnit = japi.XMGetDetailGroupUnit

---获得详情页的组的物体类型
---@type fun(位置:integer):类型:xmapi.DetailGroupType
xmapi.XMGetDetailGroupType = japi.XMGetDetailGroupType

---获得详情页的组的物体类型id
---@type fun(位置:integer):数据:integer
xmapi.XMGetDetailGroupData = japi.XMGetDetailGroupData

---获得信息面板按钮
---@type fun(x:integer,y:integer):按钮:integer
xmapi.XMFrameGetInfoPanelGroupButton = japi.XMFrameGetInfoPanelGroupButton

---获得建立面板按钮
---@type fun(位置:integer):按钮:integer
xmapi.XMFrameGetInfoPanelBuildingButton = japi.XMFrameGetInfoPanelBuildingButton
---获得载入面板按钮
---@type fun(位置:integer):按钮:integer
xmapi.XMFrameGetInfoPanelCargoButton = japi.XMFrameGetInfoPanelCargoButton
---单击按钮
---@type fun(界面:integer,按键:integer)
xmapi.XMCommandButtonClick = japi.XMCommandButtonClick
---获得命令按钮状态
---@type fun():状态:integer
xmapi.XMCommandButtonState = japi.XMCommandButtonState
---获得命令按钮图片
---@type fun():图片:string
xmapi.XMCommandButtonImage = japi.XMCommandButtonImage
---获得命令按钮禁用图片
---@type fun():图片:string
xmapi.XMCommandButtonDisImage = japi.XMCommandButtonDisImage
---获得命令按钮物品数量
---@type fun():图片:integer
xmapi.XMCommandButtonItemNum = japi.XMCommandButtonItemNum
---获得命令按钮冷却
---@type fun():时间:number
xmapi.XMCommandButtonCooldown = japi.XMCommandButtonCooldown
---获得命令按钮冷却总时间
---@type fun():时间:number
xmapi.XMCommandButtonCooldownTime = japi.XMCommandButtonCooldownTime

---注册命令按钮事件
---@type fun(触发器:trigger)
xmapi.XMCommandButtonRegisterEvent = japi.XMCommandButtonRegisterEvent

---获得控制台背包物品
---@type fun()
xmapi.XMGetInventoryItem = japi.XMGetInventoryItem


---注册控制台界面事件
---@type fun(触发器:trigger)
xmapi.XMConsoleUIRegisterEvent = japi.XMConsoleUIRegisterEvent

---注册控制台背包事件
---@type fun(触发器:trigger)
xmapi.XMInventoryRegisterEvent = japi.XMInventoryRegisterEvent
---启用虚拟控制台
---@type fun()
xmapi.XMConsoleEnableVirtual = japi.XMConsoleEnableVirtual

---物品

---设置单个物品属性[字符串]
---@type fun(物品:item,标记:xmapi.OBJECT_DATA,属性:string)
xmapi.XMSetItemAttr = japi.XMSetItemAttr

---获取单个物品属性[字符串]
---@type fun(物品:item,标记:xmapi.OBJECT_DATA):string
xmapi.XMGetItemAttr = japi.XMGetItemAttr

---设置单个物品属性[整数]
---@type fun(物品:item,标记:xmapi.OBJECT_DATA,属性:integer)
xmapi.XMSetItemAttrInteger = japi.XMSetItemAttrInteger

---获取单个物品属性[整数]
---@type fun(物品:item,标记:xmapi.OBJECT_DATA):integer
xmapi.XMGetItemAttrInteger = japi.XMGetItemAttrInteger

---设置单个物品属性[实数]
---@type fun(物品:item,标记:xmapi.OBJECT_DATA,属性:number)
xmapi.XMSetItemAttrReal = japi.XMSetItemAttrReal

---获取单个物品属性[实数]
---@type fun(物品:item,标记:xmapi.OBJECT_DATA):number
xmapi.XMGetItemAttrReal = japi.XMGetItemAttrReal

---清空物品属性
---@type fun(物品:item,标记:xmapi.OBJECT_DATA)
xmapi.XMClearItemAttr = japi.XMClearItemAttr

---设置物品样式
---@type fun(物品:item,样式:xmapi.ItemStyle)
xmapi.XMSetItemStyle = japi.XMSetItemStyle

---获得物品样式
---@type fun(物品:item):样式:xmapi.ItemStyle
xmapi.XMGetItemStyle = japi.XMGetItemStyle

---设置物品模型
---@type fun(物品:item,模型路径:string)
xmapi.XMSetItemModel = japi.XMSetItemModel

---注册物品事件
---@type fun(触发器:trigger,事件:xmapi.ITEM_EVENT_TYPE)
xmapi.XMTriggerRegisterItemEventTrg = japi.XMTriggerRegisterItemEventTrg

---获得物品的拥有单位
---@type fun(物品:item):单位:unit
xmapi.XMGetItemOwningUnit = japi.XMGetItemOwningUnit


---血条

---默认显示原生HP
---@type fun(是否显示:boolean)
xmapi.XMShowHPInterface = japi.XMShowHPInterface

---刷新血条回调
---@type fun(回调函数:fun())
xmapi.XMHPSetUpdateCallback = japi.XMHPSetUpdateCallback

---显示血条状态 0:释放 1:创建或更新血量 2:更新位置 3:隐藏
---@return integer 血条状态
---@type fun():血条状态:integer
xmapi.XMHPState = japi.XMHPState

---停止显示原生血条
---@type fun()
xmapi.XMStopUpdateHP = japi.XMStopUpdateHP

---血条x位置
---@type fun():x位置:number
xmapi.XMGetHPX = japi.XMGetHPX

---血条y位置
---@type fun():y位置:number
xmapi.XMGetHPY = japi.XMGetHPY

---刷新单位血条
---@type fun(单位:unit)
xmapi.XMRefreshHP = japi.XMRefreshHP

---血条背景界面
---@type fun():血条背景界面:integer
xmapi.XMGetHPUIInterface = japi.XMGetHPUIInterface

---其他-------------------------------------------------------------

local _loc = CJ.Location(0, 0)
---单个坐标转屏幕坐标
---@param o  unit 单位
---@return table|nil //不在屏幕返回nil,否在返回{x:number,y:number}
function xmapi.XMUnitToScreen(o)
    if o==nil then
        return
    end
    local b = japi.XMUnitToScreen(o, _loc)
    if b then
        return { x = CJ.GetLocationX(_loc), y = CJ.GetLocationY(_loc) }
    end
end

---单位

---获得单位高度
---@type fun(单位:unit,模型路径:string):单位高度:number
xmapi.XMGetUnitHeight = japi.XMGetUnitHeight

---设置单位模型
---@type fun(单位:unit,模型路径:string)
xmapi.XMSetUnitModel = japi.XMSetUnitModel

---绑定特效到单位
---@type fun(单位:unit,追加点:string,特效:effect)
xmapi.XMUnitBindEffect = japi.XMUnitBindEffect

---设置单个单位属性[字符串]
---@type fun(单位:unit,标记:xmapi.OBJECT_DATA,值:string)
xmapi.XMSetUnitAttr = japi.XMSetUnitAttr

---获取单个单位属性-字符串
---@type fun(单位:unit,标记:xmapi.OBJECT_DATA):string
xmapi.XMGetUnitAttr = japi.XMGetUnitAttr

---设置单个单位属性-整数
---@type fun(单位:unit,标记:xmapi.OBJECT_DATA,值:integer)
xmapi.XMSetUnitAttrInteger = japi.XMSetUnitAttrInteger

---获取单个单位属性-整数
---@type fun(单位:unit,标记:xmapi.OBJECT_DATA):integer
xmapi.XMGetUnitAttrInteger = japi.XMGetUnitAttrInteger

---设置单个单位属性-实数
---@type fun(单位:unit,标记:xmapi.OBJECT_DATA,值:number)
xmapi.XMSetUnitAttrReal = japi.XMSetUnitAttrReal

---获取单个单位属性-实数
---@type fun(单位:unit,标记:xmapi.OBJECT_DATA):number
xmapi.XMGetUnitAttrReal = japi.XMGetUnitAttrReal

---清空单位属性
---@type fun(单位:unit,标记:xmapi.OBJECT_DATA)
xmapi.XMClearUnitAttr = japi.XMClearUnitAttr

---显示/隐藏单位[非英雄]名字(头顶标签)
---@type fun(显示:boolean)
xmapi.XMShowUnitName = japi.XMShowUnitName

---玩家选择的单位
---@type fun(玩家:player):单位:unit
xmapi.XMGetPlayerSelectUnit = japi.XMGetPlayerSelectUnit

---本地选择的主单位---异步的
---@type fun():单位:unit
xmapi.XMGetPlayerSelectMainUnit = japi.XMGetPlayerSelectMainUnit

---获得单位技能
---@type fun(单位:unit,索引:integer,技能:ability):单位:unit
xmapi.XMGetUnitAbilityByIndex = japi.XMGetUnitAbilityByIndex

---获得单位技能类型id
---@type fun(单位:unit,索引:integer):技能id:integer
xmapi.XMGetUnitAbilityTypeIdByIndex = japi.XMGetUnitAbilityTypeIdByIndex

---注册单位事件
---@type fun(触发器:trigger,事件:xmapi.UINT_EVENT_TYPE)
xmapi.XMTriggerRegisterUnitEventTrg = japi.XMTriggerRegisterUnitEventTrg

---改变英雄主属性
---@type fun(单位:unit,主属性:xmapi.ATTRIBUTE)
xmapi.XMSetHeroPrimaryAttribute = japi.XMSetHeroPrimaryAttribute

---获得英雄主属性
---@type fun(单位:unit):主属性:xmapi.ATTRIBUTE
xmapi.XMGetHeroPrimaryAttribute = japi.XMGetHeroPrimaryAttribute

---设置单位攻击类型
---攻击类型 -1:恢复 0:没有
---@type fun(单位:unit,攻击类型:integer):主属性:xmapi.ATTRIBUTE
xmapi.XMSetUnitAttackType = japi.XMSetUnitAttackType

---设置单位移动类型
---@type fun(单位:unit,类型:xmapi.MOVE_TYPE)
xmapi.XMSetUnitMoveType = japi.XMSetUnitMoveType

---获得单位移动类型
---@type fun(单位:unit):xmapi.MOVE_TYPE
xmapi.XMGetUnitMoveType = japi.XMGetUnitMoveType

---复位单位攻击
---@type fun(单位:unit)
xmapi.XMUnitResetAttackCooldown = japi.XMUnitResetAttackCooldown

---获得单位的物品冷却剩余时间
---@type fun(单位:unit,物品类型:integer):时间:number
xmapi.XMGetUnitItemCountdown = japi.XMGetUnitItemCountdown

---获得单位的物品冷却总时间
---@type fun(单位:unit,物品类型:integer):时间:number
xmapi.XMGetUnitItemDuration = japi.XMGetUnitItemDuration

---单位添加技能
---@type fun(单位:unit,技能id:integer):boolean
xmapi.XMUnitAddAbility = japi.XMUnitAddAbility

---单位移除技能
---@type fun(单位:unit,技能id:integer)
xmapi.XMUnitRemoveAbility = japi.XMUnitRemoveAbility

---技能----------------------------------------------------------------

---获得技能的typeid
---@type fun(技能:ability):技能id:integer
xmapi.XMGetAbilityTypeId = japi.XMGetAbilityTypeId

---获得单位的技能
---@type fun(单位:unit,技能id:integer):技能:ability
xmapi.XMGetUnitAbility = japi.XMGetUnitAbility

---获得单位的技能
---@type fun(单位:unit,位置:integer):技能:ability
xmapi.XMGetUnitAbilityByIndex = japi.XMGetUnitAbilityByIndex

---获得技能的冷却总时间
---@type fun(技能:ability):冷却总时间:number
xmapi.XMGetAbilityDuration = japi.XMGetAbilityDuration

---获得技能的冷却剩余时间
---@type fun(技能:ability):冷却剩余时间:number
xmapi.XMGetAbilityCountdown = japi.XMGetAbilityCountdown

---单位组

---玩家选择的单位添加到单位组
---@param player player 玩家
---@return table 里面存了单位
function xmapi.XMGetPlayerSelectUnitToGroup(player)
    local t = {}
    japi.XMGetPlayerSelectUnitToGroup(_group, player)
    local u = CJ.FirstOfGroup(_group)
    while u ~= nil do
        table.insert(t, u)
        CJ.GroupRemoveUnit(_group, u)
        u = CJ.FirstOfGroup(_group)
    end
    return t
end

---获取单位组的单位数量
---@type fun(单位组:group):integer
xmapi.XMGetGroupUnitCount = japi.XMGetGroupUnitCount

---获取单位组指定索引单位
---@type fun(单位组:group,位置:integer):unit
xmapi.XMGetUnitFromGroupByIndex = japi.XMGetUnitFromGroupByIndex

---可破坏物

---可破坏物坐标转屏幕坐标
---@param o  destructable 可破坏物
---@return table|nil //不在屏幕返回nil,否在返回{x:number,y:number}
function xmapi.XMDestructablesToScreen(o)
    local b = japi.XMDestructablesToScreen(o, _loc)
    if b then
        return { x = CJ.GetLocationX(_loc), y = CJ.GetLocationY(_loc) }
    end
end

---定时器

---返回游戏时间
---@type fun():number
xmapi.XMGetTime = japi.XMGetTime

---创建异步定时器
---@type fun():integer
xmapi.XMCreateTimer = japi.XMCreateTimer

---当前异步计时器
---@type fun():integer
xmapi.XMGetExpiredTimer = japi.XMGetExpiredTimer

---开始异步计时器
---@type fun(定时器:integer,时间:number,是否循环:boolean,回调:fun())
xmapi.XMTimerStart = japi.XMTimerStart

---删除异步计时器
---@type fun(定时器:integer)
xmapi.XMDestroyTimer = japi.XMDestroyTimer

---触发器

---运行触发器[异步]
---@type fun(触发:trigger)
xmapi.XMExecuteTrigger = japi.XMExecuteTrigger

---获得触发器名字
---@type fun(触发:trigger):string
xmapi.XMGetTriggerName = japi.XMGetTriggerName

---触发器移除事件
---@type fun(触发:trigger,事件:event)
xmapi.XMTriggerRemoveEvent = japi.XMTriggerRemoveEvent

---触发清空事件
---@type fun(触发:trigger)
xmapi.XMTriggerClearEvents = japi.XMTriggerClearEvents

---设置触发单位 nil代表清除
---@type fun(单位:unit?)
xmapi.XMSetTriggerUnit = japi.XMSetTriggerUnit

---设置选取单位 nil代表清除
---@type fun(单位:unit?)
xmapi.XMSetEnumUnit = japi.XMSetEnumUnit

---设置触发玩家 nil代表清除
---@type fun(玩家:player?)
xmapi.XMSetTriggerPlayer = japi.XMSetTriggerPlayer

---特殊功能:

---设置更新回调
---@type fun(标志:string,回调:fun())
xmapi.XMAddUpdateCallback = japi.XMAddUpdateCallback

---清除更新回调
---@type fun(标志:string)
xmapi.XMRemoveUpdateCallback = japi.XMRemoveUpdateCallback

---给窗口发送消息(可模拟按下F10(特殊按键和按键组合)) 参数为Windows PostMessage API,自己百度PostMessage
---@type fun(msg:integer,wparam:integer,lparam:integer)
xmapi.XMPostWindowMessage = japi.XMPostWindowMessage

---直接退出war3程序
---@type fun()
xmapi.XMExit = japi.XMExit

---开启存档加密(需要游戏开始时调用) 只针对新上线的地图,如果是老地图会破坏之前存档
---xmapi.XMStoreEncrypt = japi.XMStoreEncrypt

---解锁FPS isunlock:是否解锁
---@type fun(是否解锁:boolean)
xmapi.XMUnlockFps = japi.XMUnlockFps

---获得黑边大小
---@return table {top:number,bottom:number}
function xmapi.XMGetFrameEditBlackBorders()
    japi.XMGetFrameEditBlackBorders(_loc)
    return { top = CJ.GetLocationX(_loc), bottom = CJ.GetLocationY(_loc) }
end

---设置按键为禁用状态
---@type fun(键盘值:integer,是否禁用:boolean)
xmapi.XMSetKeyState = japi.XMSetKeyState

---按键是否禁用 键盘值 1=49 f1=112 true:禁用 false:恢复
---@type fun(键盘值:integer):boolean
xmapi.XMGetKeyState = japi.XMGetKeyState

---世界坐标转屏幕坐标  x,y,z:世界坐标 loc:点(最后结果返回给这个点) 返回值: 超出屏幕返回-1 ,其他返回深度值
---@param x number x坐标
---@param y number y坐标
---@param z number z坐标
---@return number 距离 -1超出屏幕
---@return table {x:number,y:number}
function xmapi.XMWorldToScreen(x, y, z)
    local r = japi.XMWorldToScreen(_loc, x, y, z)
    return r, { x = CJ.GetLocationX(_loc), y = CJ.GetLocationY(_loc) }
end

---获得fps
---@type fun():number
xmapi.XMGetFPS = japi.XMGetFPS

---获得配置
---@type fun(配置名:string):string
xmapi.XMGetSkinConfig = japi.XMGetSkinConfig

---桌面宽度
---@type fun():integer
xmapi.XMGetScreenWidth = japi.XMGetScreenWidth

---桌面高度
---@type fun():integer
xmapi.XMGetScreenHeight = japi.XMGetScreenHeight

---设置war3窗口大小
---@type fun(宽度:integer,高度:integer,是否锁定:boolean):boolean
xmapi.XMSetWar3Size = japi.XMSetWar3Size

---war3是否窗口模式
---@type fun():boolean
xmapi.XMGetWar3IsWindow = japi.XMGetWar3IsWindow

---war3窗口是否锁定
---@type fun():boolean
xmapi.XMGetWar3IsLock = japi.XMGetWar3IsLock

---获得地图名
---@type fun():string
xmapi.XMGetMapName = japi.XMGetMapName

---获得背包格子数量
---@type fun():integer
xmapi.XMGetInventoryCapacity = japi.XMGetInventoryCapacity

---获得平台名
---"163","11","local"
---@type fun():string
xmapi.XMGetPlatformName = japi.XMGetPlatformName

---获得异步随机数
---@type fun(最小:integer,最大:integer):integer
xmapi.XMRandom = japi.XMRandom

---设置异步随机种子
---@type fun(种子:integer)
xmapi.XMRandomSeed = japi.XMRandomSeed

---解锁字节码限制 true:解锁限制 false:恢复默认
---@type fun(模式:boolean)
xmapi.XMUnlockJassLimit = japi.XMUnlockJassLimit

---释放所有字符串
---@type fun()
xmapi.XMReleaseAllString = japi.XMReleaseAllString

---命令

---屏蔽/恢复玩家指令
---@type fun(是否启用:boolean,玩家:player,模式:integer)
xmapi.XMLockOrder = japi.XMLockOrder

---获得命令按钮命令id
---@type fun(x:integer,y:integer):integer
xmapi.XMGetCommandButtonOrderId = japi.XMGetCommandButtonId
---获得命令按钮单位
---@type fun(x:integer,y:integer):integer
xmapi.XMGetCommandButtonUnit = japi.XMGetCommandButtonId

---获得命令按钮物品
---@type fun(x:integer,y:integer):integer
xmapi.XMGetCommandButtonItem = japi.XMGetCommandButtonId

---获得命令按钮技能
---@type fun(x:integer,y:integer):integer
xmapi.XMGetCommandButtonAbility = japi.XMGetCommandButtonId

---获得命令按钮科技
---@type fun(x:integer,y:integer):integer
xmapi.XMGetCommandButtonTech = japi.XMGetCommandButtonId

---获取单位技能的等级
---@type fun(单位:unit,技能代码:integer):integer
xmapi.GetUnitAbilityLevel = japi.GetUnitAbilityLevel

--同步

---获得物体的hash key
---@type fun(物体:widget)
xmapi.XMGetWidgetHashId1 = japi.XMGetWidgetHashId1

---获得物体的hash key
---@type fun(物体:widget)
xmapi.XMGetWidgetHashId2 = japi.XMGetWidgetHashId2

---将hash值转为单位
---@type fun(id1:integer,id2:integer)
xmapi.XMConvertUnit = japi.XMConvertUnit

---获得用户id
-- ---@param p player 玩家
-- ---@return string 平台id
-- function xmapi.XMGetUserID(p)
--     return globals.xm_userid[CJ.GetPlayerId(p)]
-- end

return xmapi
